Интеграция адаптивного Bootstrap шаблона сайта в 1С-Битрикс по шагам - УРОК 5


В этом уроке мы произведём интеграцию дизайна для компонентов меню.

Верхнее меню Bootstrap шаблона Stylish сайта на 1С-Битрикс

Мы создадим на сайте 3 типа меню:

  • Верхнее - тип top (файлы с именем .top.menu.php)
  • Верхнее 2 и 3 уровня - тип subtop (файлы с именем .subtop.menu.php)
  • Нижнее - тип bottom (файлы с именем .bottom.menu.php)

Верхнее меню будет наследоваться из разделов и будет многоуровневым. Нижнее же меню будет обычным одноуровневым меню, лежащим в корне.

Создадим в корне по файлу меню. Это можно сделать через административный раздел:

создание меню в административном разделе

Тогда диалог создания пунктов меню будет выглядеть так:

Диалог создания\редактирования пунктом веню в административном разделе

Либо создать файл с именем .ТИП_МЕНЮ.menu.php следующего содержания (пример для файла меню типа top:

<?
$aMenuLinks = Array(
Array(
"Home",
"/",
Array(),
Array(),
""
),
Array(
"About",
"/about/",
Array(),
Array(),
""
),
Array(
"Services",
"/services/",
Array(),
Array(),
""
),
Array(
"Collections",
"/collections/",
Array(),
Array(),
""
),
Array(
"Styles",
"/styles/",
Array(),
Array(),
""
),
Array(
"Contacts",
"/contacts/",
Array(),
Array(),
""
)
);
?>

Поскольку для раздела About в макете есть выпадающие пункты в верхнем меню, мы воспользуемся архитектурой 1С-Битрикс и создадим разделы /about/ и /about/profile/, а так же по меню типа "top" в каждом из них (пока мы не будем создавать страниц, только файловую структуру разделов и меню).

Разместим на нашей тестовой странице 1.php компонент меню bitrix:menu и далее будем работать с ним.


Нижнее меню

Начнём с нижнего меню, поскольку оно проще и позволит изучить работу компонента.

Воспользуемся шаблоном .default и зададим для работы компонента меню типа "bottom" (нижнее):

<?$APPLICATION->IncludeComponent("bitrix:menu", ".default", array(
"ROOT_MENU_TYPE" => "bottom",
"MENU_CACHE_TYPE" => "N",
"MENU_CACHE_TIME" => "3600",
"MENU_CACHE_USE_GROUPS" => "Y",
"MENU_CACHE_GET_VARS" => array(
),
"MAX_LEVEL" => "1",
"CHILD_MENU_TYPE" => "left",
"USE_EXT" => "N",
"DELAY" => "N",
"ALLOW_MULTI_SELECT" => "N"
),
false
);?>

Скопируем шаблон компонента под именем "bottom" в шаблон сайта:

Копирование шаблона компонента меню в шаблон сайта

Копирование шаблона компонента меню в шаблон сайта

Хотя это очень лаконичный шаблон, в целях обучения мы не возьмём от него практически ничего:

<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<!--Проверка подключен ли пролог-->

<?if (!empty($arResult)):?>
<!--в массиве пунктов меню есть элементы-->

<?foreach($arResult as $arItem):?>
<!--цикл перебора элементов массива пунктов меню-->

<a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a>
<!--вывод пункта меню-->


<?endforeach?>
<!--завершение цикла-->

<?endif?>

Теперь воспользуемся волшебной функцией вывода информации из переменной.

<? echo "<pre>"; print_r($arItem); echo "</pre>";?>

Поставим этот код сразу после начала цикла и сохраним шаблон. Теперь в публичной части мы увидим следующую картину:

вывод отладочной информации массива меню 1с-битрикс

Нас интересует 2 параметра:

  • [SELECTED]
  • [ITEM_INDEX]

Первый параметр не пуст тогда, когда пункт меню соответствует нашему местонахождению в структуре сайта, т.е. ВЫБРАН.

Значит, мы легко можем использовать его для вывода соответствующего стиля:

<?if($arItem["SELECTED"]):?>class="current"<?endif?>

Второй параметр отражает номер пункта меню в массиве.

Если мы немного схитрим, то сможем использовать его для простановки разделителей.

Легко определить какой пункт меню первый, однако очень непросто выяснить какой последний. Однако можно заметить, что визуально меню отображается одинаково в обоих случаях:

Все пункты меню, кроме последнего содержат разделитель:
<li><a href="URL">Menu Text</a>|</li>

Все пункты меню, кроме первого содержат разделитель:
<li>|<a href="URL">Menu Text</a></li>

сравнение оформления меню с разделителями в начале и в конце

Мы воспользуемся этой особенностью и слегка подкорректируем вёрстку. Если бы это было невозможно, нам пришлось бы завести счётчик.

Разделитель выведем следующим кодом:

<?if($arItem['ITEM_INDEX'] != 0) :?>|<?endif?>

Тогда шаблон компонента меню будет выглядеть:

<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

<?if (!empty($arResult)):?>

<ul class="footer-menu">
<?foreach($arResult as $arItem):?>
<li><?if($arItem['ITEM_INDEX'] != 0) :?>|<?endif?><a <?if($arItem["SELECTED"]):?>class="current"<?endif?> href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a></li>
<?endforeach?>
</ul>

<?endif?>

Не забудем удалить лишний мусор в папке шаблона, доставшийся нам в наследство от шаблона .default:

  • папка /images/
  • style.css

Теперь осталось только разместить вызов компонента нижнего меню вместо статики в шаблоне (не забыв указать тип кеширования, например, автоматическое и достаточно большое время кеширование, ведь нижнее меню мы будем менять редко, поэтому мы поставим 1 сутки, но вы можете поставить своё время или отключить кеширование вовсе):

<?$APPLICATION->IncludeComponent("bitrix:menu", "bottom", array(
"ROOT_MENU_TYPE" => "bottom",
"MENU_CACHE_TYPE" => "A",
"MENU_CACHE_TIME" => "86400",
"MENU_CACHE_USE_GROUPS" => "Y",
"MENU_CACHE_GET_VARS" => array(
),
"MAX_LEVEL" => "1",
"CHILD_MENU_TYPE" => "left",
"USE_EXT" => "N",
"DELAY" => "N",
"ALLOW_MULTI_SELECT" => "N"
),
false
);?>

Мы сделали простое и лёгкое меню с подсветкой выбранного раздела сайта и разделителями между пунктами меню!


Верхнее меню

Для разработки меню мы возьмём системный шаблон horizontal_multilevel и скопируем его под названием top в шаблон сайта (как уже было описано ранее для нижнего меню).

В дополнительных настройках компонента меню выберем 3 уровня вложенности меню (для построения выпадающего меню) и нижнее меню в качестве меню для 2 и 3 уровней.

Настроки параметров компонента меню для вывода 2 и 3 уровней верхнего меню

В результате получится:

вывод 3 уровневого меню с шаблоном horizontal_multilevel

ПРИМЕЧАНИЕ. Мы могли воспользоваться всего 1 типом меню - верхним. Однако тогда нам пришлось бы при разработке шаблона поставить условие не выводить дочерние пункты для 1 меню (с иконкой в виде домика вместо текста). Это усложнило бы шаблон, хотя возможно и было бы "красивее".

Обратим внимание на 2 новых параметров, характеризующих пункты меню, которые могут нас интересовать:

  • [DEPTH_LEVEL] - уровень вложенности
  • [IS_PARENT] - есть ли у пункта меню дочерние

Итак, начнём по порядку:

1й пункт меню с иконкой домики при узком разрешении экрана (на мобильных устройствах, например) превращающийся в текст задаётся в макете:

<li class="active li-first"><a href="index.html"><em class="hidden-phone"></em><span class="visible-phone">Home</span></a></li>

К сожалению, это слишком громоздкая конструкция и она слишком сильно отличается от идущих далее пунктов, поэтому придётся задать его отдельно, поставив условие на ITEM_INDEX=0. Однако стоит помнить, что индекс начинает строиться с 0 для каждого уровня, т.е. помимо индекса следует проверить и DEPTH_LEVEL=1.

Альтернативный путь - задать отдельное свойство для данного пункта меню. Это делается в расширенном режиме редактирования меню:

Переход в расширенный режим редактирования меню

Зададим пункту меню Home параметр ICON=Y:

задаём параметр пункту меню в расширенном режиме редактирования

Тогда отладочный массив будет содержать этой свойство и по нему можно будет определить нужный нам пункт меню:

отладочный массив меню со свойством, добавленным в расширенном режиме редактирования

Простейшая проверка на наличие значения в переменной ICON будет выглядеть:

<?if (!empty($arItem["PARAMS"]['ICON'])):?>
<!--Переменная НЕ пуста-->
<?else:?>
<!--Переменная пуста-->
<?endif?>

Мы воспользуемся им до всех остальных действий с меню. Поскольку у нас иконка выводится только для 1 корневого элемента логика будет максимально простой. Однако при желании мы можем передавать в этом параметре, например тип иконки или адрес её картинки, если желаем использовать несколько.

Не забудем поставить класс active в случае если пункт меню соответствует местонахождению в структуре. Тогда этот блок будет выглядеть:

 <?if (!empty($arItem["PARAMS"]['ICON'])):?>
<li class="<?if ($arItem["SELECTED"]):?>active <?endif?>li-first"><a href="<?=$arItem["LINK"]?>"><em class="hidden-phone"></em><span class="visible-phone"><?=$arItem["TEXT"]?></span></a></li>
<?else:?>
.....
<?endif?>

Теперь обратим внимание на кусок кода, осуществляющий проверку на наличие у пункта меню дочерних по условию <?if ($arItem["IS_PARENT"]):?>. Согласно макету для пунктов меню-родителей мы должны добавить класс class="sub-menu" - он добавит симпатичную стрелочку этим пунктам меню.

Так же не забудем, что начиная с пунктов родителей у нас начинается новый "список", выделяющий следующий уровень меню, который необходимо деактивировать (его активация происходит JS при наведении курсора мыши). Тогда этот блок кода будет выглядеть:

  <?if ($arItem["IS_PARENT"]):?>

<?if ($arItem["DEPTH_LEVEL"] == 1):?>
<li class="sub-menu <?if ($arItem["SELECTED"]):?> active<?endif?>"><a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a>
<ul style="display: none;">
<?else:?>
<li class="sub-menu <?if ($arItem["SELECTED"]):?> active<?endif?>"><a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a>
<ul style="display: none;">
<?endif?>

<?else:?>
...........
<?endif?>

В принципе меню готово и осталось лишь слегка его "причесать".

В частности для устройств с узким экраном верхнее меню "схлопывается" и раскрывается в ответ на нажатие кнопки "Menu". Следует завести параметр в .parameters.php в шаблоне компонента, задающий данный текст:

 "TOP_MENU_NAME" => Array(
"NAME" => GetMessage("TOP_MENU_NAME"),
"TYPE" => "HTML",
"DEFAULT" => "Menu",
), 

Создать для него языковые фразы и вывести в шаблоне компонента:

<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse_"><?=$arParams["TOP_MENU_NAME"]?></a>

Обратим лишь внимание на особенность вёрстки - кнопки социальных сервисов, которые мы ранее вынесли во включаемую область находятся внутри блока вёртки меню. А значит их следует внести внутрь шаблона компонента. Можно просто перенести вызов включаемой области внутрь шаблона.


Социальные кнопки

Несмотря на обозначенный ранее простой способ решения задачи мы воспользуемся другим, более интересным решением - вынесем социальные кнопки в параметры компонента верхнего меню.

В качестве дополнительного бонуса мы нарисовали 1 дополнительную иконку для панели социальных кнопок - Github. Надеемся, она вам понравится.

Для этого в шаблоне компонента создадим файл настроек .parameters.php.

Зададим в нём 1й параметр:

$arTemplateParameters = array(
"USE_SOCIAL_ICONS" => Array(
"NAME" => GetMessage("USE_SOCIAL_ICONS"),
"TYPE" => "CHECKBOX",
"MULTIPLE" => "N",
"VALUE" => "Y",
"DEFAULT" =>"N",
"REFRESH"=> "Y",
),
);

Этот параметр будет использоваться для активации\деактивации панели социальных кнопок. Параметр REFRESH=Y показывает 1С-Битрикс, что необходимо перезагрузить настройки после изменения этого параметра. Таким образом мы можем привязать вывод в настройках компонента остальные параметры к данному (дабы не засорять список потенциально ненужными пунктами).

Теперь зададим остальные параметры:


if ($arCurrentValues["USE_SOCIAL_ICONS"] == "Y")
{
$arTemplateParameters["SOCIAL_ICONS_TWITTER"] = array(
"NAME" => GetMessage("SOCIAL_ICONS_TWITTER"),
"TYPE" => "HTML",
"DEFAULT" => "",
);
$arTemplateParameters["SOCIAL_ICONS_FACEBOOK"] = array(
"NAME" => GetMessage("SOCIAL_ICONS_FACEBOOK"),
"TYPE" => "HTML",
"DEFAULT" => "",
);
$arTemplateParameters["SOCIAL_ICONS_GOOGLE_PLUS"] = array(
"NAME" => GetMessage("SOCIAL_ICONS_GOOGLE_PLUS"),
"TYPE" => "HTML",
"DEFAULT" => "",
);
$arTemplateParameters["SOCIAL_ICONS_RSS"] = array(
"NAME" => GetMessage("SOCIAL_ICONS_RSS"),
"TYPE" => "HTML",
"DEFAULT" => "",
);
$arTemplateParameters["SOCIAL_ICONS_GITHUB"] = array(
"NAME" => GetMessage("SOCIAL_ICONS_GITHUB"),
"TYPE" => "HTML",
"DEFAULT" => "",
);

}

Не забудем создать языковые файлы со всеми фразами для настроек компонента:

  • /bitrix/templates/stylish/components/bitrix/menu/top/lang/en/.parameters.php
  • /bitrix/templates/stylish/components/bitrix/menu/top/lang/ru/.parameters.php

В результате настройки компонента станут выглядеть так:

настройки параметров социальных кнопок для компонента верхнего меню 1С-Битрикс

Теперь добавим в шаблон компонента код, который будем выводить блок социальных кнопок, если параметр USE_SOCIAL_ICONS=Y, а каждая конкретная строка будет выводиться в случае непустого значения соответствующего параметра:

<?if ($arParams["USE_SOCIAL_ICONS"] == Y):?>
<ul class="social-icons">
<?if (!empty($arParams["SOCIAL_ICONS_TWITTER"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_TWITTER"]?>"><img src="/bitrix/templates/stylish/img/icon-1.png" alt="Twitter"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_FACEBOOK"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_FACEBOOK"]?>"><img src="/bitrix/templates/stylish/img/icon-2.png" alt="Facebook"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_GOOGLE_PLUS"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_GOOGLE_PLUS"]?>"><img src="/bitrix/templates/stylish/img/icon-3.png" alt="Google+"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_RSS"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_RSS"]?>"><img src="/bitrix/templates/stylish/img/icon-4.png" alt="RSS"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_GITHUB"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_GITHUB"]?>"><img src="/bitrix/templates/stylish/img/icon-5.png" alt="Github"></a></li><?endif?>
</ul>
<?endif?>

Осталось удалить всякий мусор из шаблона (JS, CSS, старые картинки шаблона), переместить в шаблон компонента социальные иконки из шаблона сайта и скорректировать соответствующие пути. Так же теперь можно удалить файл включаемой области с кодом социальных кнопок из шаблона сайта.


Результат работы над верхним меню

Шаблон компонента:

<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

<?if (!empty($arResult)):?>
<div class="navbar navbar_ clearfix">
<div class="navbar-inner navbar-inner_">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse_"><?=$arParams["TOP_MENU_NAME"]?></a>
<div class="nav-collapse nav-collapse_ collapse">
<ul class="nav sf-menu sf-js-enabled">

<?
$previousLevel = 0;
foreach($arResult as $arItem):?>

<?if ($previousLevel && $arItem["DEPTH_LEVEL"] < $previousLevel):?>
<?=str_repeat("</ul></li>", ($previousLevel - $arItem["DEPTH_LEVEL"]));?>
<?endif?>

<?if (!empty($arItem["PARAMS"]['ICON'])):?>
<li class="<?if ($arItem["SELECTED"]):?>active <?endif?>li-first"><a href="<?=$arItem["LINK"]?>"><em class="hidden-phone"></em><span class="visible-phone"><?=$arItem["TEXT"]?></span></a></li>
<?else:?>

<?if ($arItem["IS_PARENT"]):?>

<?if ($arItem["DEPTH_LEVEL"] == 1):?>
<li class="sub-menu <?if ($arItem["SELECTED"]):?> active<?endif?>"><a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a>
<ul style="display: none;">
<?else:?>
<li class="sub-menu <?if ($arItem["SELECTED"]):?> active<?endif?>"><a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a>
<ul style="display: none;">
<?endif?>

<?else:?>

<?if ($arItem["PERMISSION"] > "D"):?>

<li<?if ($arItem["SELECTED"]):?> class="active"<?endif?>><a href="<?=$arItem["LINK"]?>"><?=$arItem["TEXT"]?></a></li>

<?else:?>

<li><a href="" class="denied" title="<?=GetMessage("MENU_ITEM_ACCESS_DENIED")?>"><?=$arItem["TEXT"]?></a></li>

<?endif?>

<?endif?>
<?endif?>

<?$previousLevel = $arItem["DEPTH_LEVEL"];?>

<?endforeach?>

<?if ($previousLevel > 1)://close last item tags?>
<?=str_repeat("</ul></li>", ($previousLevel-1) );?>
<?endif?>


</ul>
</div>


<?if ($arParams["USE_SOCIAL_ICONS"] == Y):?>
<ul class="social-icons">
<?if (!empty($arParams["SOCIAL_ICONS_TWITTER"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_TWITTER"]?>"><img src="<?=SITE_TEMPLATE_PATH?>/components/bitrix/menu/top/images/icon-1.png" alt="Twitter"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_FACEBOOK"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_FACEBOOK"]?>"><img src="<?=SITE_TEMPLATE_PATH?>/components/bitrix/menu/top/images/icon-2.png" alt="Facebook"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_GOOGLE_PLUS"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_GOOGLE_PLUS"]?>"><img src="<?=SITE_TEMPLATE_PATH?>/components/bitrix/menu/top/images/icon-3.png" alt="Google+"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_RSS"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_RSS"]?>"><img src="<?=SITE_TEMPLATE_PATH?>/components/bitrix/menu/top/images/icon-4.png" alt="RSS"></a></li><?endif?>
<?if (!empty($arParams["SOCIAL_ICONS_GITHUB"])):?><li><a href="<?=$arParams["SOCIAL_ICONS_GITHUB"]?>"><img src="<?=SITE_TEMPLATE_PATH?>/components/bitrix/menu/top/images/icon-5.png" alt="Github"></a></li><?endif?>
</ul>
<?endif?>


</div>
</div>
</div>
<?endif?>

Осталось заменить весь верхний навигационный блок (и верхнее меню и социальные кнопки) на вызов компонента верхнего меню (мы специально оставляем 1 из социальных кнопок без адреса):

<?$APPLICATION->IncludeComponent("bitrix:menu", "top", array(
"ROOT_MENU_TYPE" => "top",
"MENU_CACHE_TYPE" => "Y",
"MENU_CACHE_TIME" => "86400",
"MENU_CACHE_USE_GROUPS" => "Y",
"MENU_CACHE_GET_VARS" => array(
),
"MAX_LEVEL" => "3",
"CHILD_MENU_TYPE" => "subtop",
"USE_EXT" => "N",
"DELAY" => "N",
"ALLOW_MULTI_SELECT" => "N",
"USE_SOCIAL_ICONS" => "Y",
"TOP_MENU_NAME" => "Меню",
"SOCIAL_ICONS_TWITTER" => "https://twitter.com/lexnekr",
"SOCIAL_ICONS_FACEBOOK" => "",
"SOCIAL_ICONS_GOOGLE_PLUS" => "https://plus.google.com/u/0/112316725504958628550/posts",
"SOCIAL_ICONS_RSS" => "http://кофедизайн.рф/information/rss/",
"SOCIAL_ICONS_GITHUB" => "https://github.com/lexnekr/bitrixtemplate_stylish"
),
false
);?> 

Не забудьте, что как в верхнем, так и в нижнем меню автор статьи ВКЛЮЧИЛ АВТО КЕШИРОВАНИЕ и задал время хранения кеша равным 1 суткам. Во время работы над сайтом при изменении пунктов меню это может доставить неудобство и потребует вручную обновить кеш (или отключить кеширование в настройках компонента), однако поскольку в меню редко повляются новые пункты во время эксплуатация компонента со включенным кешированием может быть полезна.


Результаты работы данного урока, как всегда можно найти в нашем репозитории на GitHub.


Интеграция адаптивного Bootstrap шаблона сайта в 1С-Битрикс по шагам - УРОК 5

<p><b>В этом уроке мы произведём интеграцию дизайна для компонентов меню.</b></p> <p><img src="/upload/medialibrary/47d/47d8b5ddeeb23811a88e7cf6722cbb0c.png" title="Верхнее меню Bootstrap шаблона Stylish сайта на 1С-Битрикс" hspace="5" vspace="5" border="0" alt="Верхнее меню Bootstrap шаблона Stylish сайта на 1С-Битрикс" width="561" height="340" /></p> <p>Мы создадим на сайте 3 типа меню:</p> <p> </p> <ul> <li style="text-align: justify;">Верхнее - тип top (файлы с именем .top.menu.php)</li> <li style="text-align: justify;">Верхнее 2 и 3 уровня - тип subtop (файлы с именем .subtop.menu.php)</li> <li style="text-align: justify;">Нижнее - тип bottom (файлы с именем .bottom.menu.php)</li> </ul> <p></p> <p>Верхнее меню будет наследоваться из разделов и будет многоуровневым. Нижнее же меню будет обычным одноуровневым меню, лежащим в корне.</p> <p>Создадим в корне по файлу меню. Это можно сделать через административный раздел:</p> <p><img src="/upload/medialibrary/0e9/0e98f2b7043e088a297886538b9b123b.png" title="создание меню в административном разделе" hspace="5" vspace="5" border="0" alt="создание меню в административном разделе" width="483" height="280" /></p> <p>Тогда диалог создания пунктов меню будет выглядеть так:</p> <p><img src="/upload/medialibrary/c33/c33f7c500f40b6eeab317e9db2f4f3d3.png" title="Диалог создания\редактирования пунктом веню в административном разделе" hspace="5" vspace="5" border="0" alt="Диалог создания\редактирования пунктом веню в административном разделе" width="700" height="578" /></p> <p>Либо создать файл с именем <span style="text-align: justify;">.ТИП_МЕНЮ.menu.php следующего содержания (пример для файла меню типа top:</span></p> <div class="layer" style="overflow: scroll; width: 500px; height: 300px; padding: 5px; border: 1px solid black;">&lt;? <br /> $aMenuLinks = Array( <br /> Array( <br /> &quot;Home&quot;, <br /> &quot;/&quot;, <br /> Array(), <br /> Array(), <br /> &quot;&quot; <br /> ), <br /> Array( <br /> &quot;About&quot;, <br /> &quot;/about/&quot;, <br /> Array(), <br /> Array(), <br /> &quot;&quot; <br /> ), <br /> Array( <br /> &quot;Services&quot;, <br /> &quot;/services/&quot;, <br /> Array(), <br /> Array(), <br /> &quot;&quot; <br /> ), <br /> Array( <br /> &quot;Collections&quot;, <br /> &quot;/collections/&quot;, <br /> Array(), <br /> Array(), <br /> &quot;&quot; <br /> ), <br /> Array( <br /> &quot;Styles&quot;, <br /> &quot;/styles/&quot;, <br /> Array(), <br /> Array(), <br /> &quot;&quot; <br /> ), <br /> Array( <br /> &quot;Contacts&quot;, <br /> &quot;/contacts/&quot;, <br /> Array(), <br /> Array(), <br /> &quot;&quot; <br /> ) <br /> ); <br /> ?&gt;</div> <p><span style="text-align: justify;">Поскольку для раздела About в макете есть выпадающие пункты в верхнем меню, мы воспользуемся архитектурой 1С-Битрикс и создадим разделы /about/ и </span>/about/profile/, а так же<span style="text-align: justify;"> по меню типа &quot;top&quot; в каждом из них (<i>пока мы не будем создавать страниц, только файловую структуру разделов и меню</i>).</span></p> <p><span style="text-align: justify;">Разместим на нашей тестовой странице 1.php компонент меню </span>bitrix:menu и далее будем работать с ним.</p> <p> <br /> </p> <h2>Нижнее меню</h2> <p><i>Начнём с нижнего меню, поскольку оно проще и позволит изучить работу компонента.</i></p> <p>Воспользуемся шаблоном .default и зададим для работы компонента меню типа &quot;bottom&quot; (нижнее):</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:menu&quot;, &quot;.default&quot;, array( <br /> &quot;ROOT_MENU_TYPE&quot; =&gt; &quot;bottom&quot;, <br /> &quot;MENU_CACHE_TYPE&quot; =&gt; &quot;N&quot;, <br /> &quot;MENU_CACHE_TIME&quot; =&gt; &quot;3600&quot;, <br /> &quot;MENU_CACHE_USE_GROUPS&quot; =&gt; &quot;Y&quot;, <br /> &quot;MENU_CACHE_GET_VARS&quot; =&gt; array( <br /> ), <br /> &quot;MAX_LEVEL&quot; =&gt; &quot;1&quot;, <br /> &quot;CHILD_MENU_TYPE&quot; =&gt; &quot;left&quot;, <br /> &quot;USE_EXT&quot; =&gt; &quot;N&quot;, <br /> &quot;DELAY&quot; =&gt; &quot;N&quot;, <br /> &quot;ALLOW_MULTI_SELECT&quot; =&gt; &quot;N&quot; <br /> ), <br /> false <br /> );?&gt;</td></tr> </tbody> </table> <p>Скопируем шаблон компонента под именем &quot;bottom&quot; в шаблон сайта:</p> <p><img src="/upload/medialibrary/d4d/d4d0356770ceab9da976828aeb145489.png" title="Копирование шаблона компонента меню в шаблон сайта" hspace="5" vspace="5" border="0" alt="Копирование шаблона компонента меню в шаблон сайта" width="700" height="276" /></p> <p><img src="/upload/medialibrary/95f/95f644f82f096a754544f00ef1672ff3.png" title="Копирование шаблона компонента меню в шаблон сайта" hspace="5" vspace="5" border="0" alt="Копирование шаблона компонента меню в шаблон сайта" width="552" height="591" /></p> <p>Хотя это очень лаконичный шаблон, в целях обучения мы не возьмём от него практически ничего:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?if (!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die();?&gt; <br /> <font color="#00a650">&lt;!--Проверка подключен ли пролог--&gt;</font> <br /> <br /> &lt;?if (!empty($arResult)):?&gt; <br /> <font color="#00a650">&lt;!--в массиве пунктов меню есть элементы--&gt;</font> <br /> <br /> &lt;?foreach($arResult as $arItem):?&gt; <br /> <font color="#00a650">&lt;!--цикл перебора элементов массива пунктов меню--&gt;</font> <br /> <br /> &lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt; <br /> <font color="#00a650">&lt;!--вывод пункта меню--&gt;</font> <br /> <br /> <br /> &lt;?endforeach?&gt; <br /> <font color="#00a650">&lt;!--завершение цикла--&gt;</font> <br /> <br /> &lt;?endif?&gt;</td></tr> </tbody> </table> <p><b>Теперь воспользуемся волшебной функцией вывода информации из переменной.</b></p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td><b>&lt;? echo &quot;&lt;pre&gt;&quot;; print_r($arItem); echo &quot;&lt;/pre&gt;&quot;;?&gt;</b></td></tr> </tbody> </table> <p>Поставим этот код сразу после начала цикла и сохраним шаблон. Теперь в публичной части мы увидим следующую картину:</p> <p><img src="/upload/medialibrary/af8/af8ea6f6e0bc63063072e42887bfbd27.png" title="вывод отладочной информации массива меню 1с-битрикс" hspace="5" vspace="5" border="0" alt="вывод отладочной информации массива меню 1с-битрикс" width="265" height="438" /></p> <p>Нас интересует 2 параметра:</p> <p> </p> <ul> <li>[SELECTED]</li> <li>[ITEM_INDEX]</li> </ul> <p></p> <p>Первый параметр не пуст тогда, когда пункт меню соответствует нашему местонахождению в структуре сайта, т.е. ВЫБРАН.</p> <p>Значит, мы легко можем использовать его для вывода соответствующего стиля:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?if($arItem[&quot;SELECTED&quot;]):?&gt;class=&quot;current&quot;&lt;?endif?&gt;</td></tr> </tbody> </table> <p>Второй параметр отражает номер пункта меню в массиве.</p> <p>Если мы немного схитрим, то сможем использовать его для простановки разделителей.</p> <p>Легко определить какой пункт меню первый, однако очень непросто выяснить какой последний. Однако можно заметить, что визуально меню отображается одинаково в обоих случаях:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>Все пункты меню, кроме <b>последнего</b> содержат разделитель: <br /> &lt;li&gt;&lt;a href=&quot;URL&quot;&gt;Menu Text&lt;/a&gt;|&lt;/li&gt;</td></tr> </tbody> </table> <br /> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>Все пункты меню, кроме <b>первого</b> содержат разделитель: <br /> &lt;li&gt;|&lt;a href=&quot;URL&quot;&gt;Menu Text&lt;/a&gt;&lt;/li&gt;</td></tr> </tbody> </table> <p><img src="/upload/medialibrary/87e/87ec3dcd629303cb40fee97327517351.png" title="сравнение оформления меню с разделителями в начале и в конце" hspace="5" vspace="5" border="0" alt="сравнение оформления меню с разделителями в начале и в конце" width="700" height="115" /></p> <p> Мы воспользуемся этой особенностью и слегка подкорректируем вёрстку. <i>Если бы это было невозможно, нам пришлось бы завести счётчик.</i></p> <p>Разделитель выведем следующим кодом:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?if($arItem['ITEM_INDEX'] != 0) :?&gt;|&lt;?endif?&gt;</td></tr> </tbody> </table> <p>Тогда шаблон компонента меню будет выглядеть:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?if (!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die();?&gt; <br /> <br /> &lt;?if (!empty($arResult)):?&gt; <br /> <br /> &lt;ul class=&quot;footer-menu&quot;&gt; <br /> &lt;?foreach($arResult as $arItem):?&gt; <br /> &lt;li&gt;&lt;?if($arItem['ITEM_INDEX'] != 0) :?&gt;|&lt;?endif?&gt;&lt;a &lt;?if($arItem[&quot;SELECTED&quot;]):?&gt;class=&quot;current&quot;&lt;?endif?&gt; href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt;&lt;/li&gt; <br /> &lt;?endforeach?&gt; <br /> &lt;/ul&gt; <br /> <br /> &lt;?endif?&gt;</td></tr> </tbody> </table> <p>Не забудем удалить лишний мусор в папке шаблона, доставшийся нам в наследство от шаблона .default:</p> <p> </p> <ul> <li>папка /images/</li> <li>style.css</li> </ul> <p></p> <p>Теперь осталось только разместить вызов компонента нижнего меню вместо статики в шаблоне (<i>не забыв указать тип кеширования, например, автоматическое и достаточно большое время кеширование, ведь нижнее меню мы будем менять редко, поэтому мы поставим 1 сутки, но вы можете поставить своё время или отключить кеширование вовсе</i>):</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:menu&quot;, &quot;bottom&quot;, array( <br /> &quot;ROOT_MENU_TYPE&quot; =&gt; &quot;bottom&quot;, <br /> &quot;MENU_CACHE_TYPE&quot; =&gt; &quot;A&quot;, <br /> &quot;MENU_CACHE_TIME&quot; =&gt; &quot;86400&quot;, <br /> &quot;MENU_CACHE_USE_GROUPS&quot; =&gt; &quot;Y&quot;, <br /> &quot;MENU_CACHE_GET_VARS&quot; =&gt; array( <br /> ), <br /> &quot;MAX_LEVEL&quot; =&gt; &quot;1&quot;, <br /> &quot;CHILD_MENU_TYPE&quot; =&gt; &quot;left&quot;, <br /> &quot;USE_EXT&quot; =&gt; &quot;N&quot;, <br /> &quot;DELAY&quot; =&gt; &quot;N&quot;, <br /> &quot;ALLOW_MULTI_SELECT&quot; =&gt; &quot;N&quot; <br /> ), <br /> false <br /> );?&gt;</td></tr> </tbody> </table> <p><b>Мы сделали простое и лёгкое меню с подсветкой выбранного раздела сайта и разделителями между пунктами меню!</b></p> <p> <br /> </p> <h2>Верхнее меню</h2> <p> Для разработки меню мы возьмём системный шаблон horizontal_multilevel и скопируем его под названием top в шаблон сайта (как уже было описано ранее для нижнего меню). </p> <p>В дополнительных настройках компонента меню выберем 3 уровня вложенности меню (для построения выпадающего меню) и нижнее меню в качестве меню для 2 и 3 уровней.</p> <p><img src="/upload/medialibrary/a11/a11df1c0edfef46c20867d3fe98d7e96.png" title="Настроки параметров компонента меню для вывода 2 и 3 уровней верхнего меню" hspace="5" vspace="5" border="0" alt="Настроки параметров компонента меню для вывода 2 и 3 уровней верхнего меню" width="506" height="120" /></p> <p>В результате получится:</p> <p><img src="/upload/medialibrary/b52/b5210b95c94aad036b2b7f7944d314c5.png" title="вывод 3 уровневого меню с шаблоном horizontal_multilevel" hspace="5" vspace="5" border="0" alt="вывод 3 уровневого меню с шаблоном horizontal_multilevel" width="445" height="236" /></p> <p><b>ПРИМЕЧАНИЕ.</b> <i>Мы могли воспользоваться всего 1 типом меню - верхним. Однако тогда нам пришлось бы при разработке шаблона поставить условие не выводить дочерние пункты для 1 меню (с иконкой в виде домика вместо текста). Это усложнило бы шаблон, хотя возможно и было бы &quot;красивее&quot;.</i></p> <p> Обратим внимание на 2 новых параметров, характеризующих пункты меню, которые могут нас интересовать: </p> <p> </p> <ul> <li>[DEPTH_LEVEL] - уровень вложенности</li> <li>[IS_PARENT] - есть ли у пункта меню дочерние</li> </ul> <p></p> <p>Итак, начнём по порядку:</p> <p>1й пункт меню с иконкой домики при узком разрешении экрана (на мобильных устройствах, например) превращающийся в текст задаётся в макете:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;li class=&quot;active li-first&quot;&gt;&lt;a href=&quot;index.html&quot;&gt;&lt;em class=&quot;hidden-phone&quot;&gt;&lt;/em&gt;&lt;span class=&quot;visible-phone&quot;&gt;Home&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;</td></tr> </tbody> </table> <p>К сожалению, это слишком громоздкая конструкция и она слишком сильно отличается от идущих далее пунктов, поэтому придётся задать его отдельно, поставив условие на ITEM_INDEX=0. Однако стоит помнить, что индекс начинает строиться с 0 для каждого уровня, т.е. помимо индекса следует проверить и DEPTH_LEVEL=1.</p> <p>Альтернативный путь - задать отдельное свойство для данного пункта меню. Это делается в расширенном режиме редактирования меню:</p> <p><img src="/upload/medialibrary/765/7657d97ec03f55392dfef394cf016dba.png" title="Переход в расширенный режим редактирования меню" hspace="5" vspace="5" border="0" alt="Переход в расширенный режим редактирования меню" width="700" height="366" /></p> <p>Зададим пункту меню Home параметр ICON=Y:</p> <p><img src="/upload/medialibrary/55e/55ef310a57d94606d0b812d72efcfa2c.png" title="задаём параметр пункту меню в расширенном режиме редактирования" hspace="5" vspace="5" border="0" alt="задаём параметр пункту меню в расширенном режиме редактирования" width="700" height="466" /></p> <p>Тогда отладочный массив будет содержать этой свойство и по нему можно будет определить нужный нам пункт меню:</p> <p><img src="/upload/medialibrary/7ff/7ffa9092ab7bd9b50f0b3d4b97db9b93.png" title="отладочный массив меню со свойством, добавленным в расширенном режиме редактирования" hspace="5" vspace="5" border="0" alt="отладочный массив меню со свойством, добавленным в расширенном режиме редактирования" width="285" height="446" /></p> <p> Простейшая проверка на наличие значения в переменной ICON будет выглядеть:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?if (!empty($arItem[&quot;PARAMS&quot;]['ICON'])):?&gt; <br /> <font color="#00a650">&lt;!--Переменная НЕ пуста--&gt;</font> <br /> &lt;?else:?&gt; <br /> <font color="#00a650">&lt;!--Переменная пуста--&gt;</font> <br /> &lt;?endif?&gt;</td></tr> </tbody> </table> <p>Мы воспользуемся им до всех остальных действий с меню. Поскольку у нас иконка выводится только для 1 корневого элемента логика будет максимально простой. Однако при желании мы можем передавать в этом параметре, например тип иконки или адрес её картинки, если желаем использовать несколько.</p> <p>Не забудем поставить класс active в случае если пункт меню соответствует местонахождению в структуре. Тогда этот блок будет выглядеть:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td> &lt;?if (!empty($arItem[&quot;PARAMS&quot;]['ICON'])):?&gt; <br /> &lt;li class=&quot;&lt;?if ($arItem[&quot;SELECTED&quot;]):?&gt;active &lt;?endif?&gt;li-first&quot;&gt;&lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;em class=&quot;hidden-phone&quot;&gt;&lt;/em&gt;&lt;span class=&quot;visible-phone&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; <br /> &lt;?else:?&gt; <br /> ..... <br /> &lt;?endif?&gt;</td></tr> </tbody> </table> <p>Теперь обратим внимание на кусок кода, осуществляющий проверку на наличие у пункта меню дочерних по условию &lt;?if ($arItem[&quot;IS_PARENT&quot;]):?&gt;. Согласно макету для пунктов меню-родителей мы должны добавить класс class=&quot;sub-menu&quot; - он добавит симпатичную стрелочку этим пунктам меню.</p> <p>Так же не забудем, что начиная с пунктов родителей у нас начинается новый &quot;список&quot;, выделяющий следующий уровень меню, который необходимо деактивировать (его активация происходит JS при наведении курсора мыши). Тогда этот блок кода будет выглядеть:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>  &lt;?if ($arItem[&quot;IS_PARENT&quot;]):?&gt; <br /> <br /> &lt;?if ($arItem[&quot;DEPTH_LEVEL&quot;] == 1):?&gt; <br /> &lt;li class=&quot;sub-menu &lt;?if ($arItem[&quot;SELECTED&quot;]):?&gt; active&lt;?endif?&gt;&quot;&gt;&lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt; <br /> &lt;ul style=&quot;display: none;&quot;&gt; <br /> &lt;?else:?&gt; <br /> &lt;li class=&quot;sub-menu &lt;?if ($arItem[&quot;SELECTED&quot;]):?&gt; active&lt;?endif?&gt;&quot;&gt;&lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt; <br /> &lt;ul style=&quot;display: none;&quot;&gt; <br /> &lt;?endif?&gt; <br /> <br /> &lt;?else:?&gt; <br /> ........... <br /> &lt;?endif?&gt;</td></tr> </tbody> </table> <p> В принципе меню готово и осталось лишь слегка его &quot;причесать&quot;. </p> <p>В частности для устройств с узким экраном верхнее меню &quot;схлопывается&quot; и раскрывается в ответ на нажатие кнопки &quot;Menu&quot;. Следует завести параметр в .parameters.php в шаблоне компонента, задающий данный текст:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td> &quot;TOP_MENU_NAME&quot; =&gt; Array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;TOP_MENU_NAME&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;Menu&quot;, <br /> ), </td></tr> </tbody> </table> <p>Создать для него языковые фразы и вывести в шаблоне компонента:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;a class=&quot;btn btn-navbar&quot; data-toggle=&quot;collapse&quot; data-target=&quot;.nav-collapse_&quot;&gt;&lt;?=$arParams[&quot;TOP_MENU_NAME&quot;]?&gt;&lt;/a&gt;</td></tr> </tbody> </table> <p>Обратим лишь внимание на особенность вёрстки - кнопки социальных сервисов, которые мы ранее вынесли во включаемую область находятся внутри блока вёртки меню. А значит их следует внести внутрь шаблона компонента. Можно просто перенести вызов включаемой области внутрь шаблона.</p> <p> <br /> </p> <h3>Социальные кнопки</h3> <p>Несмотря на обозначенный ранее простой способ решения задачи мы воспользуемся другим, более интересным решением - вынесем социальные кнопки в параметры компонента верхнего меню.</p> <p><i>В качестве дополнительного бонуса мы нарисовали 1 дополнительную иконку для панели социальных кнопок - Github. Надеемся, она вам понравится.</i></p> <p>Для этого в шаблоне компонента создадим файл настроек .parameters.php.</p> <p>Зададим в нём 1й параметр:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>$arTemplateParameters = array( <br /> &quot;USE_SOCIAL_ICONS&quot; =&gt; Array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;USE_SOCIAL_ICONS&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;CHECKBOX&quot;, <br /> &quot;MULTIPLE&quot; =&gt; &quot;N&quot;, <br /> &quot;VALUE&quot; =&gt; &quot;Y&quot;, <br /> &quot;DEFAULT&quot; =&gt;&quot;N&quot;, <br /> &quot;REFRESH&quot;=&gt; &quot;Y&quot;, <br /> ), <br /> );</td></tr> </tbody> </table> <p>Этот параметр будет использоваться для активации\деактивации панели социальных кнопок. Параметр REFRESH=Y показывает 1С-Битрикс, что необходимо перезагрузить настройки после изменения этого параметра. Таким образом мы можем привязать вывод в настройках компонента остальные параметры к данному (дабы не засорять список потенциально ненужными пунктами).</p> <p>Теперь зададим остальные параметры:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td> <br /> if ($arCurrentValues[&quot;USE_SOCIAL_ICONS&quot;] == &quot;Y&quot;) <br /> { <br /> $arTemplateParameters[&quot;SOCIAL_ICONS_TWITTER&quot;] = array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;SOCIAL_ICONS_TWITTER&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;&quot;, <br /> ); <br /> $arTemplateParameters[&quot;SOCIAL_ICONS_FACEBOOK&quot;] = array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;SOCIAL_ICONS_FACEBOOK&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;&quot;, <br /> ); <br /> $arTemplateParameters[&quot;SOCIAL_ICONS_GOOGLE_PLUS&quot;] = array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;SOCIAL_ICONS_GOOGLE_PLUS&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;&quot;, <br /> ); <br /> $arTemplateParameters[&quot;SOCIAL_ICONS_RSS&quot;] = array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;SOCIAL_ICONS_RSS&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;&quot;, <br /> ); <br /> $arTemplateParameters[&quot;SOCIAL_ICONS_GITHUB&quot;] = array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;SOCIAL_ICONS_GITHUB&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;&quot;, <br /> ); <br /> <br /> } <br /> </td></tr> </tbody> </table> <p>Не забудем создать языковые файлы со всеми фразами для настроек компонента:</p> <p> </p> <ul> <li>/bitrix/templates/stylish/components/bitrix/menu/top/lang/en/.parameters.php</li> <li>/bitrix/templates/stylish/components/bitrix/menu/top/lang/ru/.parameters.php</li> </ul> <p></p> <p>В результате настройки компонента станут выглядеть так:</p> <p><img src="/upload/medialibrary/7ef/7ef3369af96351a3450585de9b108399.png" title="настройки параметров социальных кнопок для компонента верхнего меню 1С-Битрикс" hspace="5" vspace="5" border="0" alt="настройки параметров социальных кнопок для компонента верхнего меню 1С-Битрикс" width="700" height="308" /></p> <p>Теперь добавим в шаблон компонента код, который будем выводить блок социальных кнопок, если параметр USE_SOCIAL_ICONS=Y, а каждая конкретная строка будет выводиться в случае непустого значения соответствующего параметра:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?if ($arParams[&quot;USE_SOCIAL_ICONS&quot;] == Y):?&gt; <br /> &lt;ul class=&quot;social-icons&quot;&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_TWITTER&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_TWITTER&quot;]?&gt;&quot;&gt;&lt;img src=&quot;/bitrix/templates/stylish/img/icon-1.png&quot; alt=&quot;Twitter&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_FACEBOOK&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_FACEBOOK&quot;]?&gt;&quot;&gt;&lt;img src=&quot;/bitrix/templates/stylish/img/icon-2.png&quot; alt=&quot;Facebook&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_GOOGLE_PLUS&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_GOOGLE_PLUS&quot;]?&gt;&quot;&gt;&lt;img src=&quot;/bitrix/templates/stylish/img/icon-3.png&quot; alt=&quot;Google+&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_RSS&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_RSS&quot;]?&gt;&quot;&gt;&lt;img src=&quot;/bitrix/templates/stylish/img/icon-4.png&quot; alt=&quot;RSS&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_GITHUB&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_GITHUB&quot;]?&gt;&quot;&gt;&lt;img src=&quot;/bitrix/templates/stylish/img/icon-5.png&quot; alt=&quot;Github&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;/ul&gt; <br /> &lt;?endif?&gt;</td></tr> </tbody> </table> <p>Осталось удалить всякий мусор из шаблона (JS, CSS, старые картинки шаблона), переместить в шаблон компонента социальные иконки из шаблона сайта и скорректировать соответствующие пути. Так же теперь можно удалить файл включаемой области с кодом социальных кнопок из шаблона сайта.</p> <p> <br /> </p> <h3>Результат работы над верхним меню</h3> <p>Шаблон компонента:</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?if (!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die();?&gt; <br /> <br /> &lt;?if (!empty($arResult)):?&gt; <br /> &lt;div class=&quot;navbar navbar_ clearfix&quot;&gt; <br /> &lt;div class=&quot;navbar-inner navbar-inner_&quot;&gt; <br /> &lt;div class=&quot;container&quot;&gt; <br /> &lt;a class=&quot;btn btn-navbar&quot; data-toggle=&quot;collapse&quot; data-target=&quot;.nav-collapse_&quot;&gt;&lt;?=$arParams[&quot;TOP_MENU_NAME&quot;]?&gt;&lt;/a&gt; <br /> &lt;div class=&quot;nav-collapse nav-collapse_ collapse&quot;&gt; <br /> &lt;ul class=&quot;nav sf-menu sf-js-enabled&quot;&gt; <br /> <br /> &lt;? <br /> $previousLevel = 0; <br /> foreach($arResult as $arItem):?&gt; <br /> <br /> &lt;?if ($previousLevel &amp;&amp; $arItem[&quot;DEPTH_LEVEL&quot;] &lt; $previousLevel):?&gt; <br /> &lt;?=str_repeat(&quot;&lt;/ul&gt;&lt;/li&gt;&quot;, ($previousLevel - $arItem[&quot;DEPTH_LEVEL&quot;]));?&gt; <br /> &lt;?endif?&gt; <br /> <br /> &lt;?if (!empty($arItem[&quot;PARAMS&quot;]['ICON'])):?&gt; <br /> &lt;li class=&quot;&lt;?if ($arItem[&quot;SELECTED&quot;]):?&gt;active &lt;?endif?&gt;li-first&quot;&gt;&lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;em class=&quot;hidden-phone&quot;&gt;&lt;/em&gt;&lt;span class=&quot;visible-phone&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt; <br /> &lt;?else:?&gt; <br /> <br /> &lt;?if ($arItem[&quot;IS_PARENT&quot;]):?&gt; <br /> <br /> &lt;?if ($arItem[&quot;DEPTH_LEVEL&quot;] == 1):?&gt; <br /> &lt;li class=&quot;sub-menu &lt;?if ($arItem[&quot;SELECTED&quot;]):?&gt; active&lt;?endif?&gt;&quot;&gt;&lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt; <br /> &lt;ul style=&quot;display: none;&quot;&gt; <br /> &lt;?else:?&gt; <br /> &lt;li class=&quot;sub-menu &lt;?if ($arItem[&quot;SELECTED&quot;]):?&gt; active&lt;?endif?&gt;&quot;&gt;&lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt; <br /> &lt;ul style=&quot;display: none;&quot;&gt; <br /> &lt;?endif?&gt; <br /> <br /> &lt;?else:?&gt; <br /> <br /> &lt;?if ($arItem[&quot;PERMISSION&quot;] &gt; &quot;D&quot;):?&gt; <br /> <br /> &lt;li&lt;?if ($arItem[&quot;SELECTED&quot;]):?&gt; class=&quot;active&quot;&lt;?endif?&gt;&gt;&lt;a href=&quot;&lt;?=$arItem[&quot;LINK&quot;]?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt;&lt;/li&gt; <br /> <br /> &lt;?else:?&gt; <br /> <br /> &lt;li&gt;&lt;a href=&quot;&quot; class=&quot;denied&quot; title=&quot;&lt;?=GetMessage(&quot;MENU_ITEM_ACCESS_DENIED&quot;)?&gt;&quot;&gt;&lt;?=$arItem[&quot;TEXT&quot;]?&gt;&lt;/a&gt;&lt;/li&gt; <br /> <br /> &lt;?endif?&gt; <br /> <br /> &lt;?endif?&gt; <br /> &lt;?endif?&gt; <br /> <br /> &lt;?$previousLevel = $arItem[&quot;DEPTH_LEVEL&quot;];?&gt; <br /> <br /> &lt;?endforeach?&gt; <br /> <br /> &lt;?if ($previousLevel &gt; 1)://close last item tags?&gt; <br /> &lt;?=str_repeat(&quot;&lt;/ul&gt;&lt;/li&gt;&quot;, ($previousLevel-1) );?&gt; <br /> &lt;?endif?&gt; <br /> <br /> <br /> &lt;/ul&gt; <br /> &lt;/div&gt; <br /> <br /> <br /> &lt;?if ($arParams[&quot;USE_SOCIAL_ICONS&quot;] == Y):?&gt; <br /> &lt;ul class=&quot;social-icons&quot;&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_TWITTER&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_TWITTER&quot;]?&gt;&quot;&gt;&lt;img src=&quot;&lt;?=SITE_TEMPLATE_PATH?&gt;/components/bitrix/menu/top/images/icon-1.png&quot; alt=&quot;Twitter&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_FACEBOOK&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_FACEBOOK&quot;]?&gt;&quot;&gt;&lt;img src=&quot;&lt;?=SITE_TEMPLATE_PATH?&gt;/components/bitrix/menu/top/images/icon-2.png&quot; alt=&quot;Facebook&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_GOOGLE_PLUS&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_GOOGLE_PLUS&quot;]?&gt;&quot;&gt;&lt;img src=&quot;&lt;?=SITE_TEMPLATE_PATH?&gt;/components/bitrix/menu/top/images/icon-3.png&quot; alt=&quot;Google+&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_RSS&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_RSS&quot;]?&gt;&quot;&gt;&lt;img src=&quot;&lt;?=SITE_TEMPLATE_PATH?&gt;/components/bitrix/menu/top/images/icon-4.png&quot; alt=&quot;RSS&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;SOCIAL_ICONS_GITHUB&quot;])):?&gt;&lt;li&gt;&lt;a href=&quot;&lt;?=$arParams[&quot;SOCIAL_ICONS_GITHUB&quot;]?&gt;&quot;&gt;&lt;img src=&quot;&lt;?=SITE_TEMPLATE_PATH?&gt;/components/bitrix/menu/top/images/icon-5.png&quot; alt=&quot;Github&quot;&gt;&lt;/a&gt;&lt;/li&gt;&lt;?endif?&gt; <br /> &lt;/ul&gt; <br /> &lt;?endif?&gt; <br /> <br /> <br /> &lt;/div&gt; <br /> &lt;/div&gt; <br /> &lt;/div&gt; <br /> &lt;?endif?&gt;</td></tr> </tbody> </table> <p>Осталось заменить весь верхний навигационный блок (и верхнее меню и социальные кнопки) на вызов компонента верхнего меню (<i>мы специально оставляем 1 из социальных кнопок без адреса</i>):</p> <table border="1" cellpadding="1" cellspacing="1"> <tbody> <tr><td>&lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:menu&quot;, &quot;top&quot;, array( <br /> &quot;ROOT_MENU_TYPE&quot; =&gt; &quot;top&quot;, <br /> &quot;MENU_CACHE_TYPE&quot; =&gt; &quot;Y&quot;, <br /> &quot;MENU_CACHE_TIME&quot; =&gt; &quot;86400&quot;, <br /> &quot;MENU_CACHE_USE_GROUPS&quot; =&gt; &quot;Y&quot;, <br /> &quot;MENU_CACHE_GET_VARS&quot; =&gt; array( <br /> ), <br /> &quot;MAX_LEVEL&quot; =&gt; &quot;3&quot;, <br /> &quot;CHILD_MENU_TYPE&quot; =&gt; &quot;subtop&quot;, <br /> &quot;USE_EXT&quot; =&gt; &quot;N&quot;, <br /> &quot;DELAY&quot; =&gt; &quot;N&quot;, <br /> &quot;ALLOW_MULTI_SELECT&quot; =&gt; &quot;N&quot;, <br /> &quot;USE_SOCIAL_ICONS&quot; =&gt; &quot;Y&quot;, <br /> &quot;TOP_MENU_NAME&quot; =&gt; &quot;Меню&quot;, <br /> &quot;SOCIAL_ICONS_TWITTER&quot; =&gt; &quot;https://twitter.com/lexnekr&quot;, <br /> &quot;SOCIAL_ICONS_FACEBOOK&quot; =&gt; &quot;&quot;, <br /> &quot;SOCIAL_ICONS_GOOGLE_PLUS&quot; =&gt; &quot;https://plus.google.com/u/0/112316725504958628550/posts&quot;, <br /> &quot;SOCIAL_ICONS_RSS&quot; =&gt; &quot;http://кофедизайн.рф/information/rss/&quot;, <br /> &quot;SOCIAL_ICONS_GITHUB&quot; =&gt; &quot;https://github.com/lexnekr/bitrixtemplate_stylish&quot; <br /> ), <br /> false <br /> );?&gt; </td></tr> </tbody> </table> <p><font color="#ff0000"><b>Не забудьте, что как в верхнем, так и в нижнем меню автор статьи ВКЛЮЧИЛ АВТО КЕШИРОВАНИЕ и задал время хранения кеша равным 1 суткам.</b> Во время работы над сайтом при изменении пунктов меню это может доставить неудобство и потребует вручную обновить кеш (или отключить кеширование в настройках компонента), однако поскольку в меню редко повляются новые пункты во время эксплуатация компонента со включенным кешированием может быть полезна.</font></p> <p> <br /> </p> <p>Результаты работы данного урока, как всегда можно найти в нашем репозитории на <noindex><a href="https://github.com/lexnekr/bitrixtemplate_stylish/tree/480bf65b3f7c38dda8554dffb124b20e916c8aa8" target="_blank" rel="nofollow" >GitHub</a></noindex>.</p> <div style="text-align: right;"><a href="http://plus.google.com/+АлексейЗадойный?rel=author" target="_blank" >Задойный А.В.</a></div>

Возврат к списку

Яндекс.Метрика